// 2003.09.10
// 2003.12.08 V1.2
// 2004.05.08 V1.3
// 2004.12.10 V1.5
// 2005.10.20 V1.6
//****************************************
//**  Copyright  (C)  W.ch  1999-2004   **
//**  Web:  http://www.winchiphead.com  **
//****************************************
//**  DLL for PCI interface chip CH365  **
//**  C, VC5.0                          **
//****************************************
//
// PCI总线接口芯片CH365的应用层接口库  V1.6
// 南京沁恒电子有限公司  作者: W.ch 2005.10
// CH365-DLL  V1.6 ,    Support: IO/MEM/INT
// 运行环境: Windows 98/ME, Windows 2000/XP
//

#ifndef		_CH365_DLL_H
#define		_CH365_DLL_H

#ifdef __cplusplus
extern "C" {
#endif


#define		mOFFSET( s, m )			( (ULONG) & ( ( ( s * ) 0 ) -> m ) )	// 定义获取结构成员相对偏移地址的宏

#ifndef		max
#define		max( a, b )				( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )	// 较大值
#endif

#ifndef		min
#define		min( a, b )				( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )	// 较小值
#endif

#ifdef		ExAllocatePool
#undef		ExAllocatePool						// 删除带TAG的内存分配
#endif

#ifndef		NTSTATUS
typedef		LONG	NTSTATUS;					// 返回状态
#endif


typedef	struct	_PCI_CONFIG {					// 定义PCI配置空间数据结构
	USHORT			mPcVendorId;				// 00H 供应商标识
	USHORT			mPcDeviceId;				// 02H 设备标识
	USHORT			mPcCommandReg;				// 04H 命令寄存器
	USHORT			mPcStatusReg;				// 06H 状态寄存器
	UCHAR			mPcRevisionId;				// 08H 修改标识
	UCHAR			mPcProgramIf;				// 09H 寄存器级编程接口
	UCHAR			mPcSubClass;				// 0AH 子类代码
	UCHAR			mPcBaseClass;				// 0BH 基本分类代码
	UCHAR			mPcCacheLine;				// 0CH 缓存行长度
	UCHAR			mPcLatenTimer;				// 0DH 延迟计数器
	UCHAR			mPcHeaderType;				// 0EH 头标类型
	UCHAR			mPcBistReg;					// 0FH 内含自测试寄存器
	ULONG			mPcBaseAddr0;				// 10H 基址寄存器0
	ULONG			mPcBaseAddr1;				// 14H 基址寄存器1
	ULONG			mPcBaseAddr2;				// 18H 基址寄存器2
	ULONG			mPcBaseAddr3;				// 1CH 基址寄存器3
	ULONG			mPcBaseAddr4;				// 20H 基址寄存器4
	ULONG			mPcBaseAddr5;				// 24H 基址寄存器5
	ULONG			mPcCardCis;					// 28H
	USHORT			mPcSubSysVen;				// 2CH 子系统供应商标识
	USHORT			mPcSubSysDev;				// 2EH 子系统设备标识
	ULONG			mPcExpansRom;				// 30H 扩展ROM基址寄存器
	UCHAR			mPcCapPtr;					// 34H
	UCHAR			mPcReserved1[3];			// 35H
	ULONG			mPcReserved2;				// 38H
	UCHAR			mPcInterLine;				// 3CH 中断线寄存器
	UCHAR			mPcInterPin;				// 3DH 中断引脚寄存器
	UCHAR			mPcMinGrant;				// 3EH
	UCHAR			mPcMaxLatency;				// 3FH
} mPCI_CONFIG, *mPPCI_CONFIG;

typedef	struct	_PCI_EXP_ROM {					// PCI扩展ROM的数据结构
	UCHAR			mPerRomSig[4];				// 00H PCI扩展ROM签名字符串'PCIR'
	USHORT			mPerVendorId;				// 04H 供应商标识
	USHORT			mPerDeviceId;				// 06H 设备标识
	USHORT			mPerVpdPtr;					// 08H 重要产品数据指针
	USHORT			mPerStrucLen;				// 0AH PCI扩展ROM数据结构的长度
	UCHAR			mPerRevision;				// 0CH PCI扩展ROM数据结构的修改版本
	UCHAR			mPerProgramIf;				// 0DH 寄存器级编程接口
	UCHAR			mPerSubClass;				// 0EH 子类代码
	UCHAR			mPerBaseClass;				// 0FH 基本分类代码
	USHORT			mPerImageLen;				// 10H 映像长度
	USHORT			mPerImageRev;				// 12H 映像中代码/数据的修改版本
	UCHAR			mPerCodeType;				// 14H 代码类型
	UCHAR			mPerIndicator;				// 15H 映像指示标志
	USHORT			mPerReserved;				// 16H
} mPCI_EXP_ROM, *mPPCI_EXP_ROM;

typedef	struct	_CH365_CFG_REG {				// CH365芯片的配置寄存器
	mPCI_CONFIG		mCh365CfgPci;				// 00H-3FH,共64字节为标准PCI配置空间
	UCHAR			mCh365CfgCtrl;				// 40H 芯片控制寄存器,高5位只读
	UCHAR			mCh365CfgDin;				// 41H 8位总线输入端口,只读
	UCHAR			mCh365CfgState;				// 42H 芯片状态寄存器,只读
	UCHAR			mCh365CfgResv;				// 43H
} mCH365_CFG_REG, *mPCH365_CFG_REG;

typedef	struct	_CH365_IO_REG {					// CH365芯片的I/O空间
	UCHAR			mCh365IoPort[0xf0];			// 00H-EFH,共240字节为标准的I/O端口
	union	{									// 以字或者以字节为单位进行存取
		USHORT		mCh365MemAddr;				// F0H 存储器接口: A15-A0地址设定寄存器
		struct	{								// 以字节为单位进行存取
			UCHAR	mCh365MemAddrL;				// F0H 存储器接口: A7-A0地址设定寄存器
			UCHAR	mCh365MemAddrH;				// F1H 存储器接口: A15-A8地址设定寄存器
		};
	};
	UCHAR			mCh365IoResv2;				// F2H
	UCHAR			mCh365MemData;				// F3H 存储器接口: 存储器数据存取寄存器
	UCHAR			mCh365I2cData;				// F4H I2C串行接口: I2C数据存取寄存器
	UCHAR			mCh365I2cCtrl;				// F5H I2C串行接口: I2C控制和状态寄存器
	UCHAR			mCh365I2cAddr;				// F6H I2C串行接口: I2C地址设定寄存器
	UCHAR			mCh365I2cDev;				// F7H I2C串行接口: I2C设备地址和命令寄存器
	UCHAR			mCh365IoCtrl;				// F8H 芯片控制寄存器,高5位只读
	UCHAR			mCh365IoBuf;				// F9H 本地数据输入缓存寄存器
	UCHAR			mCh365Speed;				// FAH 芯片速度控制寄存器
	UCHAR			mCh365IoResv3;				// FBH
	UCHAR			mCh365IoTime;				// FCH 硬件循环计数寄存器
	UCHAR			mCh365IoResv4[3];			// FDH
} mCH365_IO_REG, *mPCH365_IO_REG;

typedef	struct	_CH365_MEM_REG {				// CH365芯片的存储器空间
	UCHAR			mCh365MemPort[0x8000];		// 0000H-7FFFH,共32768字节为标准的存储器单元
} mCH365_MEM_REG, *mPCH365_MEM_REG;

typedef	struct	_WIN32_COMMAND {				// 定义WIN32命令接口结构
	union	{
		ULONG		mFunction;					// 输入时指定功能代码
		NTSTATUS	mStatus;					// 输出时返回操作状态
	};
	PVOID			mAddress;					// 起始地址,返回地址
	ULONG			mLength;					// 存取长度,返回后续数据的长度
	UCHAR			mBuffer[4];					// 数据缓冲区,长度为0至32KB
} mWIN32_COMMAND, *mPWIN32_COMMAND;

// WIN32应用层接口命令
#define		IOCTL_CH365_COMMAND		( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f36 << 2 | METHOD_BUFFERED )	// 专用接口

#define		mWIN32_COMMAND_HEAD		mOFFSET( mWIN32_COMMAND, mBuffer )	// WIN32命令接口的头长度

#define		mCH365_MAX_NUMBER		16			// 最多同时连接的CH365数

#define		mMAX_BUFFER_LENGTH		max( sizeof( mCH365_IO_REG ), sizeof( mCH365_MEM_REG ) )	// 数据缓冲区最大长度

#define		mMAX_COMMAND_LENGTH		( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH )	// 最大数据长度加上命令结构头的长度

#define		mCH365_MEM_BASE_AUTO	( (PVOID)0xffffffff )	// 自动设定CH365的存储器基址

#define		mCH365_INT_LINE_AUTO	0xffffffff				// 自动检测CH365的中断号


// 寄存器的位定义
#define		mBitAddr15Out			0x01		// 设定A15输出值,1*:high,0:low
#define		mBitSysExtOut			0x02		// 设定SYS_EX输出值,1:high,0*:low
#define		mBitIntAction			0x04		// 设定中断激活状态,1:action,0*:inaction
#define		mBitPciIdDef			0x01		// 只读,PCI设备标识的当前选择,1*:default,0:external
#define		mBitPortHit				0x04		// 只读,本地硬件定址功能的启用状态,1:启用,0*:禁用
#define		mBitInterRom			0x10		// 只读,内部Mini-ROM功能的启用状态,1:启用,0*:禁用
#define		mBitSysExtOe			0x40		// 只读,SYS_EX输出三态控制/输出使能,1*:启用,0:禁用
#define		mBitIntEnable			0x80		// 只读,中断功能的启用状态,1:启用,0*:禁用
#define		mBitI2cStatus			0x01		// I2C接口的操作控制和状态,1:开始/正在操作,0*:空闲/操作完成
#define		mBitI2cSclOut			0x80		// 选择I2C接口的SCL输出,1:SYS_EX,0*:A15
#define		mBitSpeedAct			0x07		// 速度控制,激活状态的脉冲宽度,实际宽度为该值乘以30nS
#define		mBitSpeedInact			0x10		// 速度控制,非激活状态的空闲宽度,1:前45nS/后15nS,0:前15nS/后15nS
#define		mBitSpeedPreft			0x80		// 速度控制,预取状态控制位,1:预取位有效,0:预取位无效


// 应用层接口的功能代码
#define		mFuncNoOperation		0x00000000	// 无操作
#define		mFuncGetVersion			0x00000001	// 获取驱动程序版本号
#define		mFuncGetIoBaseAddr		0x00000004	// 读取I/O端口基址
#define		mFuncSetIoBaseAddr		0x00000005	// 设置I/O端口基址
#define		mFuncGetMemBaseAddr		0x00000006	// 读取存储器基址
#define		mFuncSetMemBaseAddr		0x00000007	// 设置存储器基址,自动设定存储器基址
#define		mFuncGetInterLine		0x00000008	// 读取中断号
#define		mFuncSetInterLine		0x00000009	// 设置中断号,自动检测中断号
#define		mFuncWaitInterrupt		0x0000000a	// 等待中断,直到CH365产生中断
#define		mFuncAbortWaitInter		0x0000000b	// 放弃等待中断,终止等待
#define		mFuncSetExclusive		0x0000000c	// 设置独占使用
#define		mFuncReadIoByte			0x00000010	// 读取输入输出端口,在同一个端口地址以字节为单位连续读取
#define		mFuncReadIoWord			0x00000011	// 读取输入输出端口,在同一个端口地址以字为单位连续读取
#define		mFuncReadIoDword		0x00000012	// 读取输入输出端口,在同一个端口地址以双字为单位连续读取
#define		mFuncReadIoBlock		0x00000013	// 读取输入输出端口,每读取一个字节,端口地址加一
#define		mFuncWriteIoByte		0x00000014	// 写入输入输出端口,在同一个端口地址以字节为单位连续写入
#define		mFuncWriteIoWord		0x00000015	// 写入输入输出端口,在同一个端口地址以字为单位连续写入
#define		mFuncWriteIoDword		0x00000016	// 写入输入输出端口,在同一个端口地址以双字为单位连续写入
#define		mFuncWriteIoBlock		0x00000017	// 写入输入输出端口,每写入一个字节,端口地址加一
#define		mFuncReadMemByte		0x00000018	// 读取存储器/寄存器
#define		mFuncReadMemWord		0x00000019	// 读取存储器/寄存器
#define		mFuncReadMemDword		0x0000001a	// 读取存储器/寄存器
#define		mFuncWriteMemByte		0x0000001c	// 写入存储器/寄存器
#define		mFuncWriteMemWord		0x0000001d	// 写入存储器/寄存器
#define		mFuncWriteMemDword		0x0000001e	// 写入存储器/寄存器
#define		mFuncReadConfig			0x00000020	// 读取PCI配置空间
#define		mFuncWriteConfig		0x00000021	// 写入PCI配置空间
#define		mFuncReadBuffer1		0x00000024	// 读取中断命令缓冲区1
#define		mFuncWriteBuffer1		0x00000025	// 写入中断命令缓冲区1
#define		mFuncReadBuffer2		0x00000026	// 读取中断命令缓冲区2
#define		mFuncWriteBuffer2		0x00000027	// 写入中断命令缓冲区2


typedef		VOID	( CALLBACK	* mPCH365_INT_ROUTINE ) ( VOID );		// 中断服务程序


HANDLE	WINAPI	CH365OpenDevice(  // 打开CH365设备,返回句柄,出错则无效
	BOOL			iEnableMemory,  // 是否需要支持存储器
	BOOL			iEnableInterrupt );  // 是否需要支持中断

VOID	WINAPI	CH365CloseDevice( );  // 关闭CH365设备


ULONG	WINAPI	CH365GetVersion( );  // 获得DLL版本号,返回版本号


ULONG	WINAPI	CH365DriverCommand(  // 直接传递命令给驱动程序,出错则返回0,否则返回数据长度
	mPWIN32_COMMAND	ioCommand );  // 命令结构的指针
// 该程序在调用后返回数据长度,并且仍然返回命令结构,如果是读操作,则数据返回在命令结构中,
// 返回的数据长度在操作失败时为0,操作成功时为整个命令结构的长度,例如读一个字节,则返回mWIN32_COMMAND_HEAD+1,
// 命令结构在调用前,分别提供:命令功能代码,起始地址(可选),存取数据的长度(可选),
// 命令结构在调用后,分别返回:操作状态代码,返回的基址(可选),后续数据的长度(可选),
//   操作状态代码是由WINDOWS定义的代码,可以参考NTSTATUS.H,
//   返回的基址只适用于下列命令:获取I/O基址,获取存储器基址,获取中断号,对于其它命令则保持输入时的起始地址
//   后续数据的长度是指读操作返回的数据长度,数据存放在随后的缓冲区中,对于写操作一般为0


ULONG	WINAPI	CH365GetDrvVersion( );  // 获得驱动程序版本号,返回版本号,出错则返回0


BOOL	WINAPI	CH365GetIoBaseAddr(  // 获取I/O端口的基址
	mPCH365_IO_REG	*oIoBaseAddr );  // 保存I/O端口基址的单元地址


BOOL	WINAPI	CH365SetIoBaseAddr(  // 设定I/O端口的基址
	mPCH365_IO_REG	iIoBaseAddr );  // 指定I/O端口基址


BOOL	WINAPI	CH365GetMemBaseAddr(  // 获取存储器的基址
	mPCH365_MEM_REG	*oMemBaseAddr );  // 保存存储器基址的单元地址


BOOL	WINAPI	CH365SetMemBaseAddr(  // 设定存储器的基址
	mPCH365_MEM_REG	iMemBaseAddr );  // 指定存储器基址,为0则关闭存储器,为-1则自动设定


BOOL	WINAPI	CH365GetIntLine(  // 获取中断号
	PULONG			oIntLine );  // 保存中断号的单元地址


BOOL	WINAPI	CH365SetIntLine(  // 设定中断号
	ULONG			iIntLine );  // 指定中断号,为0则关闭中断,为-1则自动检测并设定


BOOL	WINAPI	CH365WaitInterrupt( );  // 等待中断事件


BOOL	WINAPI	CH365AbortWaitInt( );  // 放弃等待中断


BOOL	WINAPI	CH365SetIntRoutine(  // 设定中断服务程序
	mPCH365_INT_ROUTINE	iIntRoutine );  // 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序


BOOL	WINAPI	CH365ReadIntCommand(  // 读取中断命令缓冲区
	mPWIN32_COMMAND	oCommand,  // 指向一个足够大的缓冲区,用于保存读取的命令结构
	ULONG			iCmdIndex );  // 中断命令序号,为1或者2


BOOL	WINAPI	CH365WriteIntCommand(  // 写入中断命令缓冲区
	mPWIN32_COMMAND	iCommand,  // 指向作为中断命令的命令结构
	ULONG			iCmdIndex );  // 中断命令序号,为1或者2


BOOL	WINAPI	CH365ReadIoByte(  // 从I/O端口读取一个字节
	PVOID			iAddr,  // 指定I/O端口的地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365ReadIoWord(  // 从I/O端口读取一个字
	PVOID			iAddr,  // 指定I/O端口的地址
	PUSHORT			oWord );  // 指向一个字单元,用于保存读取的字数据


BOOL	WINAPI	CH365ReadIoDword(  // 从I/O端口读取一个双字
	PVOID			iAddr,  // 指定I/O端口的地址
	PULONG			oDword );  // 指向一个双字单元,用于保存读取的双字数据


BOOL	WINAPI	CH365WriteIoByte(  // 向I/O端口写入一个字节
	PVOID			iAddr,  // 指定I/O端口的地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH365WriteIoWord(  // 向I/O端口写入一个字
	PVOID			iAddr,  // 指定I/O端口的地址
	USHORT			iWord );  // 待写入的字数据


BOOL	WINAPI	CH365WriteIoDword(  // 向I/O端口写入一个双字
	PVOID			iAddr,  // 指定I/O端口的地址
	ULONG			iDword );  // 待写入的双字数据


BOOL	WINAPI	CH365ReadMemByte(  // 从存储器读取一个字节
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365ReadMemDword(  // 从存储器读取一个双字
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	PULONG			oDword );  // 指向一个双字单元,用于保存读取的双字数据


BOOL	WINAPI	CH365WriteMemByte(  // 向存储器写入一个字节
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH365WriteMemDword(  // 向存储器写入一个双字
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	ULONG			iDword );  // 待写入的双字数据


BOOL	WINAPI	CH365ReadConfig(  // 从配置空间读取一个字节数据
	PVOID			iOffset,  // 指定偏移地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365WriteConfig(  // 向配置空间写入一个字节数据
	PVOID			iOffset,  // 指定偏移地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH365SetA15_A8(  // 设置高地址,即设置A15-A8的输出
	UCHAR			iA15_A8 );  // 位7-位0对应A15-A8的输出,1为高电平,0为低电平


BOOL	WINAPI	CH365ReadI2C(  // 从I2C接口读取一个字节数据
	UCHAR			iDevice,  // 低7位指定I2C设备地址
	UCHAR			iAddr,  // 指定数据单元的地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365WriteI2C(  // 向I2C接口写入一个字节数据
	UCHAR			iDevice,  // 低7位指定I2C设备地址
	UCHAR			iAddr,  // 指定数据单元的地址
	UCHAR			iByte );  // 待写入的字节数据


HANDLE	WINAPI	CH365mOpenDevice(  // 打开CH365设备,返回句柄,出错则无效
	ULONG			iIndex,  // 指定CH365设备序号,0对应第一个设备
	BOOL			iEnableMemory,  // 是否需要支持存储器
	BOOL			iEnableInterrupt );  // 是否需要支持中断


VOID	WINAPI	CH365mCloseDevice(  // 关闭CH365设备
	ULONG			iIndex );  // 指定CH365设备序号


ULONG	WINAPI	CH365mDriverCommand(  // 直接传递命令给驱动程序,出错则返回0,否则返回数据长度
	ULONG			iIndex,  // 指定CH365设备序号
	mPWIN32_COMMAND	ioCommand );  // 命令结构的指针
// 该程序在调用后返回数据长度,并且仍然返回命令结构,如果是读操作,则数据返回在命令结构中,
// 返回的数据长度在操作失败时为0,操作成功时为整个命令结构的长度,例如读一个字节,则返回mWIN32_COMMAND_HEAD+1,
// 命令结构在调用前,分别提供:命令功能代码,起始地址(可选),存取数据的长度(可选),
// 命令结构在调用后,分别返回:操作状态代码,返回的基址(可选),后续数据的长度(可选),
//   操作状态代码是由WINDOWS定义的代码,可以参考NTSTATUS.H,
//   返回的基址只适用于下列命令:获取I/O基址,获取存储器基址,获取中断号,对于其它命令则保持输入时的起始地址
//   后续数据的长度是指读操作返回的数据长度,数据存放在随后的缓冲区中,对于写操作一般为0


BOOL	WINAPI	CH365mGetIoBaseAddr(  // 获取I/O端口的基址
	ULONG			iIndex,  // 指定CH365设备序号
	mPCH365_IO_REG	*oIoBaseAddr );  // 保存I/O端口基址的单元地址


BOOL	WINAPI	CH365mSetIoBaseAddr(  // 设定I/O端口的基址
	ULONG			iIndex,  // 指定CH365设备序号
	mPCH365_IO_REG	iIoBaseAddr );  // 指定I/O端口基址


BOOL	WINAPI	CH365mGetMemBaseAddr(  // 获取存储器的基址
	ULONG			iIndex,  // 指定CH365设备序号
	mPCH365_MEM_REG	*oMemBaseAddr );  // 保存存储器基址的单元地址


BOOL	WINAPI	CH365mSetMemBaseAddr(  // 设定存储器的基址
	ULONG			iIndex,  // 指定CH365设备序号
	mPCH365_MEM_REG	iMemBaseAddr );  // 指定存储器基址,为0则关闭存储器,为-1则自动设定


BOOL	WINAPI	CH365mGetIntLine(  // 获取中断号
	ULONG			iIndex,  // 指定CH365设备序号
	PULONG			oIntLine );  // 保存中断号的单元地址


BOOL	WINAPI	CH365mSetIntLine(  // 设定中断号
	ULONG			iIndex,  // 指定CH365设备序号
	ULONG			iIntLine );  // 指定中断号,为0则关闭中断,为-1则自动检测并设定


BOOL	WINAPI	CH365mWaitInterrupt(  // 等待中断事件
	ULONG			iIndex );  // 指定CH365设备序号


BOOL	WINAPI	CH365mAbortWaitInt(  // 放弃等待中断
	ULONG			iIndex );  // 指定CH365设备序号


BOOL	WINAPI	CH365mSetIntRoutine(  // 设定中断服务程序
	ULONG			iIndex,  // 指定CH365设备序号
	mPCH365_INT_ROUTINE	iIntRoutine );  // 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序


BOOL	WINAPI	CH365mReadIntCommand(  // 读取中断命令缓冲区
	ULONG			iIndex,  // 指定CH365设备序号
	mPWIN32_COMMAND	oCommand,  // 指向一个足够大的缓冲区,用于保存读取的命令结构
	ULONG			iCmdIndex );  // 中断命令序号,为1或者2


BOOL	WINAPI	CH365mWriteIntCommand(  // 写入中断命令缓冲区
	ULONG			iIndex,  // 指定CH365设备序号
	mPWIN32_COMMAND	iCommand,  // 指向作为中断命令的命令结构
	ULONG			iCmdIndex );  // 中断命令序号,为1或者2


BOOL	WINAPI	CH365mReadIoByte(  // 从I/O端口读取一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365mReadIoWord(  // 从I/O端口读取一个字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	PUSHORT			oWord );  // 指向一个字单元,用于保存读取的字数据


BOOL	WINAPI	CH365mReadIoDword(  // 从I/O端口读取一个双字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	PULONG			oDword );  // 指向一个双字单元,用于保存读取的双字数据


BOOL	WINAPI	CH365mWriteIoByte(  // 向I/O端口写入一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH365mWriteIoWord(  // 向I/O端口写入一个字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	USHORT			iWord );  // 待写入的字数据


BOOL	WINAPI	CH365mWriteIoDword(  // 向I/O端口写入一个双字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	ULONG			iDword );  // 待写入的双字数据


BOOL	WINAPI	CH365mReadMemByte(  // 从存储器读取一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365mReadMemDword(  // 从存储器读取一个双字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	PULONG			oDword );  // 指向一个双字单元,用于保存读取的双字数据


BOOL	WINAPI	CH365mWriteMemByte(  // 向存储器写入一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH365mWriteMemDword(  // 向存储器写入一个双字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	ULONG			iDword );  // 待写入的双字数据


BOOL	WINAPI	CH365mReadConfig(  // 从配置空间读取一个字节数据
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iOffset,  // 指定偏移地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365mWriteConfig(  // 向配置空间写入一个字节数据
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iOffset,  // 指定偏移地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH365mSetA15_A8(  // 设置高地址,即设置A15-A8的输出
	ULONG			iIndex,  // 指定CH365设备序号
	UCHAR			iA15_A8 );  // 位7-位0对应A15-A8的输出,1为高电平,0为低电平


BOOL	WINAPI	CH365mReadI2C(  // 从I2C接口读取一个字节数据
	ULONG			iIndex,  // 指定CH365设备序号
	UCHAR			iDevice,  // 低7位指定I2C设备地址
	UCHAR			iAddr,  // 指定数据单元的地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH365mWriteI2C(  // 向I2C接口写入一个字节数据
	ULONG			iIndex,  // 指定CH365设备序号
	UCHAR			iDevice,  // 低7位指定I2C设备地址
	UCHAR			iAddr,  // 指定数据单元的地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH365DelayUS(  // 延时指定微秒
	ULONG			iDelay );  // 指定要延时的微秒数,如果延时小于10则误差较大


BOOL	WINAPI	CH365mAccessBlock(  // 读取或者写入数据块
	ULONG			iIndex,  // 指定CH365设备序号
	ULONG			iAccessMode,  // 参考下面的说明
	PVOID			iAddr,  // 指定I/O端口或者存储器的地址
	PVOID			ioBuffer,  // 指向输入或者输出的缓冲区
	ULONG			iLength );  // 数据块长度,也就是读取或者写入的字节数,长度不超过32KB
// iAccessMode 定义如下
// #define		mFuncReadIoByte			0x00000010	// 读取输入输出端口,在同一个端口地址以字节为单位连续读取,最大长度32KB
// #define		mFuncReadIoWord			0x00000011	// 读取输入输出端口,在同一个端口地址以字为单位连续读取,最大长度32KB
// #define		mFuncReadIoDword		0x00000012	// 读取输入输出端口,在同一个端口地址以双字为单位连续读取,最大长度32KB
// #define		mFuncReadIoBlock		0x00000013	// 读取输入输出端口,每读取一个字节,端口地址加一,最大长度240B(从偏移地址00H读到EFH)
// #define		mFuncWriteIoByte		0x00000014	// 写入输入输出端口,在同一个端口地址以字节为单位连续写入,最大长度32KB
// #define		mFuncWriteIoWord		0x00000015	// 写入输入输出端口,在同一个端口地址以字为单位连续写入,最大长度32KB
// #define		mFuncWriteIoDword		0x00000016	// 写入输入输出端口,在同一个端口地址以双字为单位连续写入,最大长度32KB
// #define		mFuncWriteIoBlock		0x00000017	// 写入输入输出端口,每写入一个字节,端口地址加一,最大长度240B(从偏移地址00H写到EFH)
// #define		mFuncReadMemByte		0x00000018	// 读取存储器/寄存器,以字节为单位连续读,每读取一个字节,地址加一,最大长度32KB(从偏移地址0000H读到7FFFH)
// #define		mFuncReadMemWord		0x00000019	// 读取存储器/寄存器,以字为单位连续读,每读取一个字,地址加二,最大长度32KB(从偏移地址0000H读到7FFFH)
// #define		mFuncReadMemDword		0x0000001a	// 读取存储器/寄存器,以双字为单位连续读,每读取一个字节,地址加四,最大长度32KB(从偏移地址0000H读到7FFFH)
// #define		mFuncWriteMemByte		0x0000001c	// 写入存储器/寄存器,以字节为单位连续写,每读取一个字节,地址加一,最大长度32KB(从偏移地址0000H写到7FFFH)
// #define		mFuncWriteMemWord		0x0000001d	// 写入存储器/寄存器,以字为单位连续写,每读取一个字,地址加二,最大长度32KB(从偏移地址0000H写到7FFFH)
// #define		mFuncWriteMemDword		0x0000001e	// 写入存储器/寄存器,以双字为单位连续写,每读取一个双字,地址加四,最大长度32KB(从偏移地址0000H写到7FFFH)
// 其它方式不支持,上述定义在文件CH365DLL.H中


BOOL	WINAPI	CH365mSetExclusive(  // 设置独占使用当前CH365设备
	ULONG			iIndex,  // 指定CH365设备序号
	ULONG			iExclusive );  // 为0则设备可以共享使用,非0则独占使用


#ifdef __cplusplus
}
#endif

#endif		// _CH365_DLL_H
